package com.laity.bQueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.bQueue.SynchronousQueueDemo
 * @Date: 2023年11月29日 00:09
 * @Description: SynchronousQueue 同步队列
 * 和其他的阻塞队列不同的是，SynchronousQueue 是一个没有缓冲区的队列，
 * put()方法会一直阻塞，直到有消费者消费(take)了这个值。
 */

public class SynchronousQueueDemo {
    // SynchronousQueue 同步队列
    public static void main(String[] args) {
        test1();
    }

    public static void test1() {
        // 同步队列
        BlockingQueue<String> synchronousQueue = new SynchronousQueue<>();
        // 生产者
        new Thread(() -> {
            try {
                // 存值
                System.out.println(Thread.currentThread().getName() + " 生产PUT 1");
                synchronousQueue.put("1");
                System.out.println(Thread.currentThread().getName() + " 生产PUT 2");
                synchronousQueue.put("2");
                System.out.println(Thread.currentThread().getName() + " 生产PUT 3");
                synchronousQueue.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "生产者").start();

        new Thread(() -> {
            try {
                // 取值
                TimeUnit.SECONDS.sleep(2);
                System.out.println(synchronousQueue.take());
                TimeUnit.SECONDS.sleep(2);
                System.out.println(synchronousQueue.take());
                TimeUnit.SECONDS.sleep(2);
                System.out.println(synchronousQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "消费者").start();
    }
}
